package com.zzzy.common.vo;

import com.zzzy.common.enums.ResultCodeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;

/**
 * Description: 请求返回结果
 *
 * @author fc
 * @date 2024/4/10
 */
@Data
@Schema(description = "请求返回体")
public class AjaxResult<T> implements Serializable {
    private static final long serialVersionUID = -8951382848863581212L;

    @Schema(description = "处理结果code，成功为200，403 认证失败/登录过期", example = "200")
    private String code;

    @Schema(description = "处理信息", example = "成功")
    private String message;

    @Schema(description = "处理结果")
    private T result;

    /**
     * 返回自定义信息
     * @param code 自定义返回码
     * @param message 自定义信息
     * @return
     */
    public static <T> AjaxResult<T> build(String code, String message){
        AjaxResult<T> ajaxResult = new AjaxResult<>();
        ajaxResult.setCode(code);
        ajaxResult.setMessage(message);
        return ajaxResult;
    }
    /**
     * 返回自定义信息
     * @param code 自定义返回码
     * @param message 自定义信息
     * @param result 返回数据
     * @return
     */
    public static <T> AjaxResult<T> build(String code, String message, T result){
        AjaxResult<T> ajaxResult = build(code, message);
        ajaxResult.setResult(result);
        return ajaxResult;
    }
    /**
     * 返回指定枚举错误信息
     * @param resultCodeEnum 结果枚举类
     * @return
     */
    public static <T> AjaxResult<T> build(ResultCodeEnum resultCodeEnum){
        return build(resultCodeEnum.getCode(), resultCodeEnum.getMessage());
    }
    /**
     * 请求成功，返回无结果信息
     * @return
     */
    public static <T> AjaxResult<T> success(){
        return build(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage());
    }

    /**
     * 请求成功，返回有结果信息
     * @param result 返回结果
     * @return
     */
    public static <T> AjaxResult<T> success(T result){
        return build(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), result);
    }

    /**
     * 请求失败，默认返回业务异常code，返回自定义错误信息
     * @param message 自定义错误信息
     * @return
     */
    public static <T> AjaxResult<T> error(String message){
        return build(ResultCodeEnum.BUSINESS_ERROR.getCode(), message);
    }

    /**
     * 请求失败，默认返回业务异常code，返回自定义警告信息
     * @param message 自定义错误信息
     * @return
     */
    public static <T> AjaxResult<T> warn(String message){
        return build(ResultCodeEnum.WARNING.getCode(), message);
    }

    /**
     * 请求失败，默认返回业务警告code，返回自定义警告信息
     * @param result 自定义返回体
     * @return
     */
    public static <T> AjaxResult<T> warnWithResult(T result){
        return build(ResultCodeEnum.WARNING.getCode(), ResultCodeEnum.WARNING.getMessage(), result);
    }
}
